package ar.uba.dc.tlen.src.production;

import java.util.ArrayList;

import ar.uba.dc.tlen.src.exceptions.InvalidProductionException;
import ar.uba.dc.tlen.src.symbols.Caracter;
import ar.uba.dc.tlen.src.symbols.NoTerminal;
import ar.uba.dc.tlen.src.symbols.Terminal;



public class Produccion {
	private Caracter izquierda;
	private ArrayList<Caracter> derecha;
	 /* PRE: El caracter pertenece a un noTerminal y que la lista
	  * tiene al menos un elemento. Para cada posicion de lista debe haber 
	  * exactamente un elemento.
	  */
	public Produccion(Caracter caracter, ArrayList<Caracter> lista) throws InvalidProductionException{
		
		if(lista.size() == 0){
			throw new InvalidProductionException("parte derecha de la produccion vacia.");
		}
		if(caracter.getClass() == Terminal.class){
			throw new InvalidProductionException("terminal en la parte derecha de la produccion.");
		}
		derecha= new ArrayList<Caracter>();
		this.izquierda = caracter;
		int pos = 0;
		Caracter actual=null;
		if (lista.get(0) instanceof Terminal) {
			actual = (Terminal) lista.get(0);
		}else {
			actual = (NoTerminal) lista.get(0);
		}
//		Caracter actual = lista.get(0);
		derecha.add(actual);
		/* Si tiene mas de un elemento ademas agrego el siguiente e itero agregando
		 * el resto. El primer caso y el ultimo se tratan aparte
		 */
		if (lista.size() > 1) {
			Caracter siguiente = lista.get(pos+1);
			Caracter anterior;
			lista.get(pos).getDerecha().add(siguiente);
			for(pos= 1; pos < lista.size()-1; pos++){
				//Seteo el nuevo valor de las referencias
				actual = lista.get(pos);
				siguiente = lista.get(pos+1);
				anterior = lista.get(pos-1);
				
				derecha.add(actual);
				actual.getDerecha().add(siguiente);
				actual.getIzquierda().add(anterior);
			}
			//Trato el ultimo elemento de manera especial.
			actual = lista.get(lista.size()-1);
			anterior = lista.get(lista.size()-2);
			derecha.add(actual);
			actual.getIzquierda().add(anterior);		
		}
	} 
	public ArrayList<Caracter> getDerecha() {
		return derecha;
	}
	public void setDerecha(ArrayList<Caracter> derecha) {
		this.derecha = derecha;
	}
	public Caracter getIzquierda() {
		return izquierda;
	}
	public void setIzquierda(Caracter izquierda) {
		this.izquierda = izquierda;
	}
}
